function run( gameID, mapstring, players, a_doMajorCycle ) {
	var game = new irinori.Game( gameID );
	var selfIndex;
    var i;
	game.InitMap( irinori.Map.DecodeMapString( 16, 12, mapstring ) );

	for ( i = 0; i < players.length; i++ )
	{
		player = new irinori.Player( players[i].playerName, players[i].playerID );
		player.initRobot( players[i].posX, players[i].posY, players[i].direction, players[i].robotType, players[i].spawnX, players[i].spawnY );
        //Health status
        player.m_robot.m_health = players[i].health;
        player.m_robot.m_lives = players[i].lives;
        player.m_robot.m_alive = players[i].alive;
        player.m_robot.m_powerDownStatus = players[i].powerDownStatus;
        player.m_robot.m_nextCheckpoint = players[i].nextCheckpoint;        
       
		game.AddPlayer( player );

		if ( players[i].self )
		{
			selfIndex = i;
            game.m_clientPlayer = player;
		}
	}

	game.InitRegisterDeck();
	game.m_players[selfIndex].m_cards = game.m_registerDeck.CardStringToCards( players[selfIndex].cards );
    //Time to set registers
    


	var engine = new irinori.engine();

	var robotStatusView = new irinori.RobotStatusView(game.m_clientPlayer, document.getElementById("robotStatus"), engine.m_gameview);
	robotStatusView.Draw();

	var registerView = new irinori.RegisterView(game.m_clientPlayer, document.getElementById("registers"), document.getElementById("hand"), document.getElementById("ready"));
	registerView.Draw(game);

    if (a_doMajorCycle)
    {
        for (i = 0; i < players.length; i++) 
        {
            if (game.m_players[i].m_robot.m_lives > 0)
            {
                game.m_players[i].m_robot.m_registers[0].AssignCard(game.m_registerDeck.m_cards[players[i].register1] ); 
                game.m_players[i].m_robot.m_registers[1].AssignCard(game.m_registerDeck.m_cards[players[i].register2] );
                game.m_players[i].m_robot.m_registers[2].AssignCard(game.m_registerDeck.m_cards[players[i].register3] );
                game.m_players[i].m_robot.m_registers[3].AssignCard(game.m_registerDeck.m_cards[players[i].register4] );
                game.m_players[i].m_robot.m_registers[4].AssignCard(game.m_registerDeck.m_cards[players[i].register5] );
            }
        }

        engine.SetCurrentGame(game);
        engine.DoMajorCycle();

        robotStatusView.Draw();
        registerView.Draw(game);
    }
    else
    {
        engine.m_gameview.Draw( game );
    }  
	
}
